package com.zyl.file.platform;

import cn.hutool.core.util.StrUtil;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zyl.file.dto.SplitUploadDTO;
import com.zyl.file.mapper.StFileMapper;
import com.zyl.file.po.StFile;
import com.zyl.file.vo.SplitUploadVO;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author zyl
 * @Description 文件存储接口，对应各个平台
 * @since 2024/1/18 16:53
 */
public abstract class FileStorage implements AutoCloseable {

    @Resource
    private StFileMapper stFileMapper;
    /******************************************      分片上传相关       *************************************/

    /**
     * 根据md5标识获取分片上传任务
     * @param identifier 文件md5
     * @return
     */
    public StFile getByIdentifier(String identifier) {
        List<StFile> stFiles = stFileMapper.selectList(new QueryWrapper<StFile>().lambda().eq(StFile::getSourceFileMd5, identifier));
        if (!CollectionUtils.isEmpty(stFiles)) {
            return stFiles.get(0);
        }
        return null;
    }

    /**
     * 获取文件地址
     * @param endpoint 域名
     * @param bucket 存储桶
     * @param objectKey 文件在存储桶的路径
     * @return
     */
    public String getPath(String endpoint, String bucket, String objectKey) {
        if (StrUtil.isBlank(endpoint)) {
            return StrUtil.format("{}{}/{}", endpoint, bucket, objectKey);
        }
        return StrUtil.format("{}/{}/{}", endpoint, bucket, objectKey);
    }

    /**
     * 初始化一个任务
     * @param param
     * @param id
     * @return
     */
   public abstract SplitUploadDTO initTask(SplitUploadVO param, Long id);

    /**
     * 获取上传进度
     * @param identifier 文件md5
     * @return
     */
   public abstract SplitUploadDTO getTaskInfo(String identifier,Integer isEncrypt);

    /**
     * 生成预签名上传url
     * @param identifier 文件md5
     * @param partNumber 分片位置
     * @param type 区分移动端和pc端，移动端传值为0，pc端不传
     * @param isOpen 是否是open
     * @return
     */
    public abstract String genPreSignUploadUrl(String identifier, Integer partNumber, String type,Boolean isOpen);

    /**
     * 合并分片
     * @param identifier 文件md5
     * @param isFlat 是否偏离矫正
     * @return
     */
    public abstract StFile merge(String identifier, Boolean isFlat);


}
